﻿#include "RootContactItem.h"
#include <QPaintEvent>
#include <qpainter.h>
#include "define.h"

RootContactItem::RootContactItem(bool hasArrow, QWidget *parent)
	: hasArrow(hasArrow), 
	QLabel(parent), 
	an(nullptr), rotation(0)
{
	init();
}

RootContactItem::~RootContactItem()
{
}

int RootContactItem::getRotation()
{
	return rotation;
}

void RootContactItem::setRotation(int r)
{
	rotation = r;
	update();				//角度发生改变触发重绘
}

void RootContactItem::setText(const QString & text)
{
	titleText = text;
	update();			//文本发生改变触发重绘
}

void RootContactItem::setExpanded(bool expand = false)
{
	if (expand)
	{
		an->setEndValue(90);
	}
	else
	{
		an->setEndValue(0);
	}

	an->start();
}

void RootContactItem::paintEvent(QPaintEvent * event)
{
	// 保留默认的绘制行为
	QLabel::paintEvent(event);

	//绘制文本
	QPainter paintText(this);
	paintText.setRenderHint(QPainter::TextAntialiasing, true);	// 文本抗锯齿

	QFont font;
	font.setPointSize(10);
	paintText.setFont(font);

	//在原点为(24,0)宽高为(width()-24,height())的区域内绘制文本
	paintText.drawText(24, 0, width() - 24, height(),
		Qt::AlignLeft | Qt::AlignVCenter, titleText);

	if (hasArrow) {
		QPixmap arrow(QRC_MAIN_PNG("arrow"));

		// 动态调整画布尺寸以适应旋转角度
		QSize rotatedSize = arrow.size();
		if (rotation % 180 != 0) {
			rotatedSize.transpose(); // 90/270度时交换宽高
		}
		QPixmap pixmap(rotatedSize);
		pixmap.fill(Qt::transparent);

		QPainter paintImage(&pixmap);
		paintImage.setRenderHint(QPainter::SmoothPixmapTransform, true);

		// 坐标系操作
		paintImage.translate(rotatedSize.width() / 2, rotatedSize.height() / 2);
		paintImage.rotate(rotation);

		// 根据箭头原图尺寸精确定位
		paintImage.drawPixmap(
			-arrow.width() / 2,
			-arrow.height() / 2,
			arrow
		);

		// 绘制到界面时，使用旋转后的尺寸计算位置
		paintText.drawPixmap(
			6,
			(height() - rotatedSize.height()) / 2,
			pixmap
		);
	}
}

void RootContactItem::init()
{
	/*​​
	水平方向​​：Expanding 表示控件会​​尽可能扩展​​以占用可用空间（与其他 Expanding 控件平分）。
​​	垂直方向​​：Fixed 表示控件​​高度由自身决定​​（此处被 setFixedHeight(32) 明确固定为32）。
	*/
	setFixedHeight(32);
	setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed);

	// 创建控制 this 对象 rotation 属性的动画
	an = new QPropertyAnimation(this, "rotation", this);
	// 动画总时长 30ms（一帧约为 33ms，接近瞬时完成）
	an->setDuration(30);
	// 使用缓入效果（适合需要快速启动的场景）
	an->setEasingCurve(QEasingCurve::InQuad);
}
